/*
 * HastalikGrubu.java
 */
package eDoktor.hastalikGrubu;

import eDoktor.hastalik.Belirti;
import eDoktor.hastalik.Hastalik;
import eDoktor.kararMekanizmasi.KararAgaciYontemi;
import eDoktor.kararMekanizmasi.KararFabrikasi;
import eDoktor.kararMekanizmasi.KararYontemiArayuz;
import eDoktor.kararMekanizmasi.PuanlamaYontemi;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Hastalık grubu sınıfı
 * @author Onuralp
 */
public class HastalikGrubu {
    private int no;
    private String tanim;
    private List<Hastalik> hastaliklar;
    private List<Soru> sorular;
    private Map<Soru, Belirti> soruBelirtiIliskisi;
    private KararFabrikasi servisSaglayici;

    /**
     * HastalikGrubu sınıfının yapılandırıcısı
     */
    public HastalikGrubu() {
        no = 0;
        tanim = "";
        hastaliklar = new ArrayList<Hastalik>();
        sorular = new ArrayList<Soru>();
        soruBelirtiIliskisi = new HashMap<Soru, Belirti>();
    }

    /**
     * HastalikGrubu sınıfının degiskenlerine erişmeyi sağlayan fonksiyonlar 
     */
    
    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public String getTanim() {
        return tanim;
    }

    public void setTanim(String tanim) {
        this.tanim = tanim;
    }

    public List<Hastalik> getHastaliklar() {
        return hastaliklar;
    }

    public void setHastaliklar(List<Hastalik> hastaliklar) {
        this.hastaliklar = hastaliklar;
    }

    public List<Soru> getSorular() {
        return sorular;
    }

    public void setSorular(List<Soru> sorular) {
        this.sorular = sorular;
    }
    
    /**
     * Hastanın sorulan sorulara verdiği cevapları değerlendir.
     * @return Tespit edilen hastalık
     */
    public Hastalik degerlendir() {
        Hastalik tespitEdilenHastalik = null; 
        double enYuksekOlasilik = 0;
        for (Soru soru : sorular) {
            soruBelirtiIliskisi.put(soru, soru.getBelirti());
        }
        ArrayList<Soru> soruListesi = new ArrayList<Soru>(sorular);
        for (Hastalik hastalik : hastaliklar) {
            KararFabrikasi kararStratejisi = servisSaglayici.ornekOlustur();
            Map<String, Cevap> vaka = new HashMap<String, Cevap>();
            for (Belirti belirti : hastalik.getBelirtiler()) {
                for (Soru soru : soruListesi) {
                    if ((soruBelirtiIliskisi.get(soru) != null) && (soruBelirtiIliskisi.get(soru).getNo() == belirti.getNo())) {
                        String belirtiNo = (new Integer(belirti.getNo())).toString();
                        vaka.put(belirtiNo, soru.getCevap());
                        soruBelirtiIliskisi.remove(soru);
                        soruListesi.remove(soru);
                        break;
                    }
                }
            }
            double olasilik = kararStratejisi.kararMekanizmasiniCalistir(vaka, hastalik);
            if (olasilik > enYuksekOlasilik) {
                enYuksekOlasilik = olasilik;
                tespitEdilenHastalik = hastalik;
            }
        }
        if (enYuksekOlasilik >= 0.5) {
            System.out.println("HastalikGrubu - tespitEdilenHastalik=1");
            return tespitEdilenHastalik;
        }
        else {
            System.out.println("HastalikGrubu - tespitEdilenHastalik=0");
            return new Hastalik();
        }
    }
}
